﻿/***********************************************
  [className] CPdfRptBase
  [func]      pdf报表工具类
  [author]    WeiXiaoYu
  [date]      2025/01/02 09:57
  [log]       初次建立
[Modification Log]
Vers            By            Notes
************************************************/

#ifndef CPdfRptTool_H
#define CPdfRptTool_H

#include <QObject>
#include <QString>
#include <QImage>
//#include <QFont>
#include <QPainter>
#include <QPrinter>
//pdf报表字体等级枚举
enum EPdfRptFontLevel
{
	enPdfRptFontLev13 = 0,//字体等级1 (13号字) PS:13号字用于绘制表格中非带图片巡检项名称、巡检点名称的字体
	enPdfRptFontLev13Bold,//字体等级1加粗 
	enPdfRptFontLev18,//字体等级2 (18号字)  PS:18号字用于绘制通用表格中内容的字体
	enPdfRptFontLev18Bold,//字体等级2加粗 
	enPdfRptFontLev24, //字体等级3 (24号字) PS:24号字用于绘制表格标题的字体
	enPdfRptFontLev24Bold,//字体等级3加粗 
	enPdfRptFontLev30, //字体等级4 (30号字)
	enPdfRptFontLev30Bold,//字体等级4加粗 
	enPdfRptFontLev40, //字体等级5 (40号字) PS:40号字用于绘制报告名称的字体
	enPdfRptFontLev40Bold//字体等级5加粗 
};

//pdf报表画笔等级枚举
enum EPdfRptPenLevel
{
	enPdfRptPenBlack = 0,//画笔颜色黑
	enPdfRptPenBlackBold,//画笔颜色黑加粗
	enPdfRptPenRed,//画笔颜色红
	enPdfRptPenRedBold//画笔颜色红加粗
};


//pdf报表常用位置枚举
enum EPdfRptComPosition
{
	enPdfRptPosCusCpy = 0,//客户公司位置(X行X列) (弘扬用不到，弘扬画在异常列表后面)
	enRobPdfRptPosName,//机器人报告名称位置(X行X列)
	enPdfPosSinglePointName,//单个巡检点名称位置
	enSynPdfRptPosName,//综合报告名称位置(X行X列)
	enRecPdfRptPosName,//纠偏报告名称位置(X行X列)
	enTearPdfRptPosName,//撕裂报告名称位置(X行X列)
	enRestAiPdfRptPosName//其他AI检测报告名称位置(X行X列)
};

class CPdfRptTool  : public QObject
{
	Q_OBJECT

public:
	CPdfRptTool(QObject *parent = nullptr);
	~CPdfRptTool();

	/***************************************************************
	* @brief     函数功能:定义最小单元格(初始化需要调用,不调用则默认)
	* @input     dWidthVal|最小单元格的宽度值
	* @input     dHeightVal|最小单元格的高度值
	* @return    void |返回空
	* @note
	* @author    WeiXiaoYu
	* @time      2025-01-03 13:30
	* @Modification Log]
	 Vers            By            Notes
	**************************************************************/
	void defineMinCell(double dWidthVal, double dHeightVal);

	/***************************************************************
	* @brief     函数功能:设置字体和画笔等级
	* @input     eFontLevel|字体等级枚举
	* @input     ePenLevel|画笔等级枚举
	* @return    void |返回空
	* @note
	* @author    WeiXiaoYu
	* @time      2025-01-03 13:30
	* @Modification Log]
	 Vers            By            Notes
	**************************************************************/
	void setFontAndPenLevel(EPdfRptFontLevel eFontLevel, EPdfRptPenLevel ePenLevel);
	
	
	/***************************************************************
	* @brief     函数功能:绘制表格附带文字
	* @input     dStartRow|绘制起始行
	* @input     dStartCol|绘制起始列
	* @input     dWidthsCnt|占据几个最小单元格宽度
	* @input     dHeightsCnt|占据几个最小单元格高度
	* @input     sText|表格中的文字
	* @input     painter|QPainter对象
	* @input     printer|QPrinter对象
	* @output    sErrMsg|错误描述
	* @return    bool |成功返回true，失败返回false
	* @note      
	* @author    WeiXiaoYu
	* @time      2025-01-03 13:30
	* @Modification Log]
	 Vers            By            Notes
	**************************************************************/
	bool drawFormAttachText(double &dStartRow, double &dStartCol, double dWidthsCnt, double dHeightsCnt, QString sText, QPainter &painter, QPrinter &printer, QString &sErrMsg);

	/***************************************************************
	* @brief     函数功能:绘制表格附带图片
	* @input     dStartRow|绘制起始行
	* @input     dStartCol|绘制起始列
	* @input     dWidthsCnt|占据几个最小单元格宽度
	* @input     dHeightsCnt|占据几个最小单元格高度
	* @input     pixmap|表格中的图片QPixmap信息
	* @input     painter|QPainter对象
	* @input     printer|QPrinter对象
	* @output    sErrMsg|错误描述
	* @return    bool |成功返回true，失败返回false
	* @note
	* @author    WeiXiaoYu
	* @time      2025-01-03 13:30
	* @Modification Log]
	 Vers            By            Notes
	**************************************************************/
	bool drawFormAttachPic(double &dStartRow, double &dStartCol, double dWidthsCnt, double dHeightsCnt, QPixmap &pixmap, QPainter &painter, QPrinter &printer, QString &sErrMsg);

	/***************************************************************
	* @brief     函数功能:判断执行自动换页
	* @input     dStartRow|绘制起始行
	* @input     dStartCol|绘制起始列
	* @input     nNeedRows|绘制所需行数
	* @input     printer|QPrinter对象
	* @output    sErrMsg|错误描述
	* @return    bool |成功返回true，失败返回false
	* @note
	* @author    WeiXiaoYu
	* @time      2025-01-03 13:30
	* @Modification Log]
	 Vers            By            Notes
	**************************************************************/
	bool judgeExecAutoPageChg(double &dStartRow, double &dStartCol, int nNeedRows, QPrinter &printer, QString &sErrMsg);

	/***************************************************************
	* @brief     函数功能:绘制单文本(指定行列位置)
	* @input     nStartRow|绘制起始行
	* @input     nStartCol|绘制起始列
	* @input     eFontLevel|字体等级枚举
	* @input     eFontColour|字体颜色枚举
	* @input     sText|绘制的文本信息
	* @input     painter|QPainter对象
	* @input     printer|QPrinter对象
	* @output    sErrMsg|错误描述
	* @return    bool |成功返回true，失败返回false
	* @note
	* @author    WeiXiaoYu
	* @time      2025-01-03 13:30
	* @Modification Log]
	 Vers            By            Notes
	**************************************************************/
	bool drawSingleText(int nStartRow, int nStartCol, EPdfRptFontLevel eFontLevel, EPdfRptPenLevel ePenLevel, QString sText, QPainter &painter, QPrinter &printer, QString &sErrMsg);

	/***************************************************************
	* @brief     函数功能:绘制单文本(指定枚举的位置)
	* @input     ePosition|枚举的位置
	* @input     sText|绘制的文本信息
	* @input     painter|QPainter对象
	* @input     printer|QPrinter对象
	* @output    sErrMsg|错误描述
	* @return    bool |成功返回true，失败返回false
	* @note
	* @author    WeiXiaoYu
	* @time      2025-01-03 13:30
	* @Modification Log]
	 Vers            By            Notes
	**************************************************************/
	bool drawSingleText(EPdfRptComPosition ePosition, QString sText, QPainter &painter, QPrinter &printer, QString &sErrMsg);

	/***************************************************************
	* @brief     函数功能:绘制表格线加粗(主要用于外边框加粗)
	* @input     nStartRow|绘制起始行
	* @input     nStartCol|绘制起始列
	* @input     nWidths|表格宽度(占据几个最小单元格宽度)
	* @input     nHeights|表格高度(占据几个最小单元格高度)
	* @output    sErrMsg|错误描述
	* @return    bool |成功返回true，失败返回false
	* @note
	* @author    WeiXiaoYu
	* @time      2025-01-03 13:30
	* @Modification Log]
	 Vers            By            Notes
	**************************************************************/
	bool drawFormLineBold(int nStartRow, int nStartCol, int nWidths, int nHeights, QString &sErrMsg);



	double getPageMaxCellHeightCnt();//获取页面最大表格高度个数

	/***************************************************************
	* @brief     函数功能:返回下一个行列(绘制完返回下一个可用于绘制的行列号)
	* @input     dStartRow|绘制起始行
	* @input     dStartCol|绘制起始列
	* @input     dWidthsCnt|占据几个最小单元格宽度
	* @input     dHeightsCnt|占据几个最小单元格高度
	* @return    void |空
	* @note
	* @author    WeiXiaoYu
	* @time      2025-01-03 13:30
	* @Modification Log]
	 Vers            By            Notes
	**************************************************************/
	void retNextRowAndCol(double &dStartRow, double &dStartCol, double dWidthsCnt, double dHeightsCnt);

private:
	//获取字体(根据字体等级)
	QFont getExpFont(EPdfRptFontLevel eFontLevel);
	//获取画笔(根据画笔等级)
	QPen getExpPen(EPdfRptPenLevel ePenLevel);
	//获取位置(根据位置枚举)
	void getExpPosition(EPdfRptComPosition ePosition, double &dRow, double &dCol);


	double m_dCellMinWidth;//表格最小宽度
	double m_dCellMinHeight;//表格最小高度
	double m_dPageMaxCellWidthCnt;//页面最大表格宽度个数
	double m_dPageMaxCellHeightCnt;//页面最大表格高度个数
	

	EPdfRptFontLevel m_eFontLevel;//当前字体等级

	EPdfRptPenLevel m_ePenLevel;//当前画笔等级
};
#endif
